package pers.jl.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import pers.jl.common.MyException;
import pers.jl.common.R;

import java.sql.SQLIntegrityConstraintViolationException;

/**
 * 全局异常处理类
 */
@ControllerAdvice
@ResponseBody// 响应json数据
@Slf4j
public class GlobalExceptionHandler {

    /**
     * 当新增员工，姓名重复时，mysql会报唯一性错误，这个方法会进行处理
     * 使用Exception相比SQLIntegrityConstraintViolationException范围更大，但是不利于拦截种指定异常，不推荐
     * SQLIntegrityConstraintViolationException更细，指定处理该类异常，异常消息也更少。
     * @ExceptionHandler  这个注解对所有加了@RequestMapping()的类抛出的异常，都会处理
     * @param ex
     * @return
     */
    @ExceptionHandler(SQLIntegrityConstraintViolationException.class)
    public R<String> exceptionHandler(SQLIntegrityConstraintViolationException ex){
        log.error(ex.getMessage());
        if(ex.getMessage().contains("Duplicate entry")){
            String[] split = ex.getMessage().split(" ");
            String msg = split[2] + "已存在";
            return R.error(msg);
        }
        return R.error("未知错误");
    }

    /**
     * 用户删除分类失败时返回错误信息
     * @return
     */
    @ExceptionHandler(MyException.class)// 拦截指定异常
    public R<String> exceptionHandler(MyException ex){
        // 打印异常日志信息
        log.error(ex.getMessage());
        // 将异常信息展示给用户，这个信息是我们提前写好的
        return R.error(ex.getMessage());
    }
}
